home *** CD-ROM | disk | FTP | other *** search
/ Interplay's Learn to Program Basic (Review Copy) / Learn to Program Basic Review Copy (Interplay)(June 23, 1998).ISO / pc / ltpbasic / projects / tank.bas < prev    next >
BASIC Source File  |  1998-03-02  |  7KB  |  318 lines

  1. Rem Tank Battle
  2.  
  3. Rem Declare the arrays
  4. Rem Use an array for the variables
  5. Rem that control the tanks.  That
  6. Rem way, we can use a 1 for tank
  7. Rem one and a 2 for tank two and
  8. Rem not have to have a seperate
  9. Rem variable for each tank.
  10. Rem Plus, we could add more tanks,
  11. Rem if we wanted to.
  12. Dim X(2)
  13. Dim Y(2)
  14. Dim angle(2)
  15. Dim bulletX(2)
  16. Dim bulletY(2)
  17. Dim bulletAngle(2)
  18. Dim g$(2)
  19. Dim l$(2)
  20. Dim r$(2)
  21. Dim f$(2)
  22. Dim tank(2)
  23. Dim bllspr(2)
  24. Dim timelatch(2)
  25. Dim hits(2)
  26. Dim spin(2)
  27. Rem This array is used to help match our direction number with the sprite frame number
  28. Dim remap(8)
  29.  
  30. Rem this variable describes how many
  31. Rem total obstacles, including
  32. Rem both rocks and houses
  33. Rem that we have in the data statements
  34. lastObs = 7
  35.  
  36. Rem This array will hold the locations of all of our obstacles
  37. Dim ObsX(lastObs)
  38. Dim ObsY(lastObs)
  39.  
  40. Rem Set up the screen and sprites
  41. cls
  42. Background "Tank"
  43. tank(1) = LoadSprite("bluetank")
  44. tank(2) = LoadSprite("redtank")
  45. house = LoadSprite("house")
  46.  
  47. Rem Sounds
  48. Rem -- Slightly different each tank
  49. Rem Sound of tank moving
  50. Dim tankSnd(2)
  51. tankSnd(1) = LoadSound("Tank1")
  52. tankSnd(2) = LoadSound("Tank2")
  53. Dim turnSnd(2)
  54. turnSnd(1) = LoadSound("Squeak")
  55. turnSnd(2) = LoadSound("Squeak")
  56. Dim shootSnd(2)
  57. shootSnd(1) = LoadSound("BigGun1")
  58. shootSnd(2) = LoadSound("BigGun2")
  59. Dim spinSnd(2)
  60. spinSnd(1) = LoadSound("DuckDth")
  61. spinSnd(2) = LoadSound("HeadShke")
  62. Dim hitObsSnd(2)
  63. hitObsSnd(1) = LoadSound("Punch")
  64. hitObsSnd(2) = LoadSound("EyePop")
  65. bombSnd = LoadSound("Exp_Med")
  66.  
  67. Rem This data is the 'remap' table for tank direction
  68. data 0,6,2,7,1,4,3,5
  69. Rem Create a table that will match the sprite frames to direction
  70. for z = 1 to 8
  71. read remap(z)
  72. next z
  73.  
  74.  
  75. Rem X-Y coordinates for obstacles
  76. Rem All obstacles are assumed to be 32x32
  77. Rem these are for the rocks 
  78. Rem that are part of the background
  79. data 32,32,64,32,224,32,160,32
  80. data 192,160,64,192
  81. Rem remaining x,y pairs are for houses
  82. data 125,140
  83.  
  84. Rem Read in data for obstacles
  85. Rem The first 6 are for mountains
  86. for i = 1 to lastObs
  87. read ObsX(i)
  88. read ObsY(i)
  89. if i > 6 then
  90. SetSprite house to ObsX(i),ObsY(i)
  91. PasteSprite house
  92. HideSprite house
  93. endif
  94. next i
  95.  
  96. Rem Set up bullet sprites
  97. bllspr(1) = LoadSprite("bullet")
  98. CycleSprite bllspr(1)
  99. HideSprite bllspr(1)
  100. bllspr(2) = LoadSprite("bullet")
  101. CycleSprite bllspr(2)
  102. HideSprite bllspr(2)
  103.  
  104. Rem Set up the data that defines the players
  105. Rem position and key commands
  106. lasttank = 2
  107. g$(1) = "w"
  108. l$(1) = "a"
  109. r$(1) = "d"
  110. f$(1) = "s"
  111. angle(1) = 0
  112. x(1) = 80
  113. y(1) = 100
  114. spin(1) = 0
  115. timelatch(1) = timer()
  116. bulletX(1) = -1
  117. g$(2) = "i"
  118. l$(2) = "j"
  119. r$(2) = "l"
  120. f$(2) = "k"
  121. angle(2) = 3.1415
  122. x(2) = 280
  123. y(2) = 130
  124. spin(2) = 0
  125. bulletX(2) = -1
  126. timelatch(2) = timelatch(1)
  127.  
  128. Rem Set up the turn delay and how long the game is
  129. turndelay = 350
  130. timeend = timer() + 120000
  131. gameon = 1
  132.  
  133. while gameon
  134. for b = 1 to lasttank
  135. Rem Get keyboard commands from
  136. Rem the current player
  137. if keydown(g$(b)) then gosub Forward
  138. if keydown(l$(b)) then gosub Left
  139. if keydown(r$(b)) then gosub Right
  140. if keydown(f$(b)) then gosub Fire
  141.  
  142. Rem If the tank is spinning, spin it!
  143. if timer() < spin(b) then
  144. fr = random(0,7)
  145. angle(b) = .7853981 * fr
  146. else
  147.  
  148. Rem set the proper frame for the tank sprite
  149. fr = angle(b) / (2*3.1415926)
  150. fr = fr * 8
  151. fr = fr + .5
  152. if fr >= 8 then fr = fr - 8
  153. endif
  154.  
  155. SetSprite tank(b) frame remap(fr+1)
  156. SetSprite tank(b) to x(b),y(b)
  157.  
  158. Rem If the bullet is active, update it
  159. if bulletX(b) <> -1 then gosub Bullet
  160.  
  161. next b
  162.  
  163. Rem Update the information text
  164. position 0,14
  165. timeleft = int((timeend - timer())/1000)
  166. if timeleft >0 then
  167. print timeleft;" left Grey Pts:";hits(2);" Green Pts:";hits(1);"  "
  168. else
  169. gameon = 0
  170. endif
  171. wend
  172.  
  173. Rem Time's up!  Now print who scored
  174. Rem the most hits.
  175. cls
  176. for t = 1 to lasttank
  177. HideSprite bllspr(t)
  178. HideSprite tank(t)
  179. next t
  180. print "Number of points per tank:"
  181. print "Grey tank points:";hits(2)
  182. print "Green tank points:";hits(1)
  183. print
  184. if hits(1) = hits(2) then
  185. print "The match was a tie!"
  186. else
  187. if hits(1) > hits(2) then
  188. print "Green tank wins!"
  189. else
  190. print "Grey tank wins!"
  191. endif
  192. endif
  193. Sound "GamOver1"
  194. banner "Game Over"
  195. end
  196.  
  197. Forward:
  198. Rem Use trigonometry to step the tank forward
  199. incx = 2*cos(angle(b))
  200. incy = 2*sin(angle(b))
  201. PlaySound(tankSnd(b))
  202.  
  203. Rem first check if going forward would take the tank out of bounds
  204. Rem or make it hit an obstacle
  205. xhit = x(b) + incx + 16
  206. yhit = y(b) + incy + 16
  207. stop = 0
  208. checkbullet = 0
  209. gosub HitObstacle
  210.  
  211. Rem If all is OK, move the tank forward
  212. if stop = FALSE then
  213. x(b) = x(b) + incx
  214. y(b) = y(b) + incy
  215. endif
  216. return
  217.  
  218. Rem For turning left and right, a timelatch is used to cause a third-second
  219. Rem delay between turns
  220.  
  221. Rem Turn left
  222. Left:
  223. if timelatch(b) < timer() - turndelay then
  224. PlaySound(turnSnd(b))
  225. angle(b) = angle(b) - .7854
  226. if angle(b) < 0 then angle(b) = 6.283
  227. timelatch(b) = timer()
  228. endif
  229. return
  230.  
  231. Rem Turn right
  232. Right:
  233. if timelatch(b) < timer() - turndelay then
  234. PlaySound(turnSnd(b))
  235. angle(b) = angle(b) + .7854
  236. if angle(b) > 6.283 then angle(b)= 0
  237. timelatch(b) = timer()
  238. endif
  239. return
  240.  
  241. Rem Fire a tank bullet
  242. Fire:
  243. if bulletX(b) = -1 then
  244. PlaySound(shootSnd(b))
  245. bulletX(b) = x(b) + 15
  246. bulletY(b) = y(b) + 11
  247. bulletAngle(b) = angle(b)
  248. endif
  249. return
  250.  
  251. Rem Subroutine used to move the bullet - before each
  252. Rem step, check if it hits an obstacle
  253. Bullet:
  254. bulletX(b) = bulletX(b) + (12*cos(bulletAngle(b)))
  255. bulletY(b) = bulletY(b) + (12*sin(bulletAngle(b)))
  256. xhit = bulletX(b) + 1
  257. yhit = bulletY(b) + 1
  258. checkbullet = 1
  259. Rem check for obstacles that will stop the bullet
  260. gosub HitObstacle
  261. If Stop = FALSE Then
  262. Rem Draw the bullet
  263. SetSprite bllspr(b) to bulletX(b), bulletY(b)
  264. Rem now check for tanks in its path
  265. for z = 1 to lasttank
  266. if z <> b then
  267. tankx = x(z) + 15
  268. tanky = y(z) + 15
  269. Rem If we've hit this tank, spin it around...
  270. If SpriteHitSprite(bllspr(b),tank(z)) = TRUE Then
  271. PlaySound(spinSnd(z))
  272. spin(z) = timer() + 1000
  273. hits(z) = hits(z) + 1
  274. stop = 1
  275. endif
  276. endif
  277. next z
  278. EndIf
  279.  
  280. if stop then
  281. PlaySound(bombSnd)
  282. HideSprite bllspr(b)
  283. bulletX(b) = -1
  284. bulletY(b) = -1
  285. endif
  286. return
  287.  
  288. Rem This subroutine will take the variables xhit and yhit
  289. Rem and check them against the screen boundaries and whether
  290. Rem they hit an obstacle.  If any of these are true, stop will
  291. Rem equal to one.
  292. HitObstacle:
  293. stop = 0
  294. if xhit > 0 and xhit < 319 and yhit > 0 and yhit < 239 then
  295. for i = 1 to LastObs
  296. if checkbullet then
  297. xob1 = ObsX(i)
  298. xob2 = xob1 + 31  ' Obstacles are 32x32
  299. yob1 = ObsY(i)
  300. yob2 = yob1 + 31
  301. else
  302. xob1 = ObsX(i) - 16 ' Center point of a 32x32 obstacle
  303. xob2 = xob1 + 31 + 16
  304. yob1 = ObsY(i) - 16
  305. yob2 = yob1 + 31 + 16
  306. endif
  307. Rem We can't use sprite collision test if sprite is pasted, so we check by coordinate
  308. if xhit >= xob1 and xhit <= xob2 and yhit >= yob1 and yhit <= yob2 then 
  309. stop = 1
  310. PlaySound(hitObsSnd(b))
  311. Endif
  312. next i
  313. else
  314. stop = 1
  315. endif
  316. return
  317.